#include <stdio.h>
#include <stdlib.h>  // 引入stdlib.h以使用rand()和srand()
#include <time.h>    // 引入time.h以使用time()

// 定义PID结构体
typedef struct {
    double setpoint;    // 设定点
    double kp;          // 比例增益
    double ki;          // 积分增益
    double kd;          // 微分增益
    double integral;    // 积分项
    double prev_error;  // 上一次的误差
} PID;

// 初始化PID控制器
void PID_Init(PID *pid, double setpoint, double kp, double ki, double kd) {
    pid->setpoint = setpoint;
    pid->kp = kp;
    pid->ki = ki;
    pid->kd = kd;
    pid->integral = 0.0;
    pid->prev_error = 0.0;
}

// 更新PID控制器
double PID_Update(PID *pid, double pv, double dt) {
    double error = pid->setpoint - pv; // 计算误差
    pid->integral += error * dt;      // 积分项累加（考虑时间步长）
    
    // 计算微分项
    double derivative = (error - pid->prev_error) / dt;
    
    // 计算PID输出
    double output = pid->kp * error + pid->ki * pid->integral + pid->kd * derivative;
    
    // 更新前一次的误差
    pid->prev_error = error;
    
    return output;
}

int main() {
    PID myPID;
    PID_Init(&myPID, 100.0, 0.1, 0.05, 0.01); // 设定点100，KP=0.1, KI=0.05, KD=0.01

    double process_variable = 0.0; // 假设这是系统的当前值

    // 初始化随机数生成器
    srand((unsigned)time(NULL));

    const double dt = 1.0; // 时间步长（假设每步时间为1秒）

    // 模拟PID控制过程
    for (int i = 0; i < 1000; i++) {
        // 为process_variable添加一个随机增量（这里假设增量在-5到5之间）
        double random_increment = (double)rand() / RAND_MAX * 10.0 - 5.0;
        process_variable += random_increment;

        // 更新PID并获取输出
        double control = PID_Update(&myPID, process_variable, dt);

        // 这里可以添加代码将control值应用于系统（例如，控制一个电机速度）

        printf("Step %d: PV = %.2f, Control = %.2f\n", i, process_variable, control);
    }

    return 0;
}
